<HTML>
<HEAD>
<!-- This HTML file has been created by texi2html 1.29
     from ptg.tnf on 19 December 2010 -->

<TITLE>Pattern-based Text Generator - Pattern Specifications</TITLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000" BACKGROUND="gifs/bg.gif">
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0" VALIGN=BOTTOM>
<TR VALIGN=BOTTOM>
<TD WIDTH="160" VALIGN=BOTTOM>
<A HREF="http://eli-project.sourceforge.net/">
<IMG SRC="gifs/elilogo.gif" BORDER=0>
</A>&nbsp;
</TD>
<TD WIDTH="25" VALIGN=BOTTOM>
<img src="gifs/empty.gif" WIDTH=25 HEIGHT=25>
</TD>
<TD ALIGN=LEFT WIDTH="475" VALIGN=BOTTOM>
<A HREF="index.html"><IMG SRC="gifs/title.png" BORDER=0></A>
</TD>
<!-- |DELETE FOR SOURCEFORGE LOGO|
<TD>
<a href="http://sourceforge.net/projects/eli-project">
<img
  src="http://sflogo.sourceforge.net/sflogo.php?group_id=70447&amp;type=13"
  width="120" height="30"
  alt="Get Eli: Translator Construction Made Easy at SourceForge.net.
    Fast, secure and Free Open Source software downloads"/>
</a>
</TD>
|DELETE FOR SOURCEFORGE LOGO| -->
</TR>
</TABLE>

<HR size=1 noshade width=785 align=left>
<TABLE BORDER=0 CELLSPACING=2 CELLPADDING=0>
<TR>
<TD VALIGN=TOP WIDTH="160">
<h4>General Information</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="index.html">Eli: Translator Construction Made Easy</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gindex_1.html#SEC1">Global Index</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="faq_toc.html" >Frequently Asked Questions</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Tutorials</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="EliRefCard_toc.html">Quick Reference Card</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="novice_toc.html">Guide For new Eli Users</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="news_toc.html">Release Notes of Eli</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="nametutorial_toc.html">Tutorial on Name Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="typetutorial_toc.html">Tutorial on Type Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Reference Manuals</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ui_toc.html">User Interface</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="pp_toc.html">Eli products and parameters</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lidoref_toc.html">LIDO Reference Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Libraries</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lib_toc.html">Eli library routines</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="modlib_toc.html">Specification Module Library</a></td></tr>
</table>

<h4>Translation Tasks</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lex_toc.html">Lexical analysis specification</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="syntax_toc.html">Syntactic Analysis Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="comptrees_toc.html">Computation in Trees</a></td></tr>
</table>

<h4>Tools</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lcl_toc.html">LIGA Control Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="show_toc.html">Debugging Information for LIDO</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gorto_toc.html">Graphical ORder TOol</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="fw_toc.html">FunnelWeb User's Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ptg_toc.html">Pattern-based Text Generator</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="deftbl_toc.html">Property Definition Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="oil_toc.html">Operator Identification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="tp_toc.html">Tree Grammar Specification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="clp_toc.html">Command Line Processing</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="cola_toc.html">COLA Options Reference Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="idem_toc.html">Generating Unparsing Code</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="mon_toc.html">Monitoring a Processor's Execution</a> </td></tr>
</table>

<h4>Administration</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="sysadmin_toc.html">System Administration Guide</a> </td></tr>
</table>

<HR WIDTH="100%">
<A HREF="mailto:eli-project-users@lists.sourceforge.net">
<IMG SRC="gifs/button_mail.gif" BORDER=0 ALIGN="left"></A>
<A HREF="index.html"><IMG SRC="gifs/home.gif" BORDER=0 ALIGN="right"></A>

</TD>
<TD VALIGN=TOP WIDTH="25"><img src="gifs/empty.gif" WIDTH=25 HEIGHT=25></TD>

<TD VALIGN=TOP WIDTH="600">
<H1>Pattern-based Text Generator</H1>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="ptg_1.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="ptg_3.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="ptg_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
<H1><A NAME="SEC2" HREF="ptg_toc.html#SEC2">Pattern Specifications</A></H1>
<A NAME="IDX9"></A>
<A NAME="IDX10"></A>
<A NAME="IDX11"></A>
<P>
A pattern is specified by a named sequence of C string literals and
<CODE>$</CODE> tokens that denote insertion points, e.g.
<P>
<PRE>
   Pair: "(" $ "." $ ")" /* S-expression */
</PRE>
<A NAME="IDX12"></A>
<P>
C style comments may be inserted anywhere in a PTG specification.
<P>
The pattern describes an output text that consists of the specified sequence of
strings with the results of pattern applications being inserted
at each insertion point.
<P>
A pattern is applied by calling a PTG generated function that has the
name of the pattern preceded by <CODE>PTG</CODE>, <CODE>PTGPair</CODE> in this
case. The result of such a call yields a pointer of type <CODE>PTGNode</CODE>
which represents that pattern application.
<A NAME="IDX13"></A>
<A NAME="IDX14"></A>
<A NAME="IDX15"></A>
<P>
The pattern function takes as many arguments of type <CODE>PTGNode</CODE>
as the pattern has insertion points. The arguments are obtained
from other calls of pattern functions. Their order corresponds to
that of the insertion points in the pattern.
(Alternative forms of are described in See  <A HREF="ptg_2.html#SEC3">Indexed Insertion Points</A> and See  <A HREF="ptg_2.html#SEC4">Typed Insertion Points</A>.)
<P>
The pattern function for the example above has the following signature:
<P>
<PRE>
   PTGNode PTGPair (PTGNode a, PTGNode b)
</PRE>
Examples for applications of this pattern are:
<P>
<PRE>
   x = PTGPair (PTGNil(), PTGNil());
   y = PTGPair (x, x);
</PRE>
<P>
<H4>Restrictions:</H4>
<A NAME="IDX16"></A>
<P>
For every two patterns in all <CODE>.ptg</CODE> specifications, the following condition
must hold: If any two patterns are not equal, their names must be different.
Additionally, the names of the patterns must not collide with identifiers
predefined for PTG.
<A NAME="IDX17"></A>
<P>
PTG does not insert any additional white space before or after
elements of the pattern sequence. Token separation and new line
characters (especially at the end of a file) have to be specified
explicitly.
<P>
<H2><A NAME="SEC3" HREF="ptg_toc.html#SEC3">Indexed Insertion Points</A></H2>
<A NAME="IDX18"></A>
<A NAME="IDX19"></A>
<P>
The insertion points of a pattern may be identified by numbers, e.g.
<CODE>$1</CODE>, <CODE>$2</CODE>. This facility allows to insert an argument
of a pattern function call at several positions in the pattern,
and it allows to modify patterns without the need to change their
application calls.
<P>
In the following example the first argument (the module name)
is inserted at two positions:
<P>
<PRE>
   Module: "module " $1 "\nbegin" $2 "end " $1 ";\n" 
</PRE>
The pattern function is called with two arguments.
<P>
The correspondence between insertion points and function parameters
is specified by the numbers of the insertion points, i.e. the first
argument is inserted at the insertion points <CODE>$1</CODE>.
<P>
This facility also makes the calls of pattern functions more independent
of pattern modifications. For example, the following pattern
describing declarations
<P>
<PRE>
   Decl: $1 /* type */ " " $2 /* identifiers */ ";\n"
</PRE>
would be applied by a call <CODE>PTGDecl (tp, ids)</CODE>, with the first argument
inserting the type and the second inserting the identifiers.
Those calls are invariant against changing the pattern to
Pascal-like declaration style:
<P>
<PRE>
   Decl: $2 ":" $1 ";"
</PRE>
In the same way one variant of a pattern may omit an argument specified 
in an other variant.
<P>
In general a pattern may contain several occurrences of any of the
insertion point markers <CODE>$</CODE><I>i</I>. There is practically no upper bound for 
<CODE>$</CODE><I>i</I>. The generated function has <I>n</I> parameters, where <I>n</I> is 
the maximal <I>i</I> occurring in a <CODE>$</CODE><I>i</I> of the pattern. The 
<I>i</I>-th function argument is substituted at each occurrence of <CODE>$</CODE><I>i</I>
in the pattern.
<P>
If a pattern does not mention all <CODE>$</CODE><I>i</I> between <CODE>$1</CODE>
and the maximum <CODE>$</CODE><I>n</I>, e.g. <CODE>$1</CODE> and <CODE>$3</CODE> but not <CODE>$2</CODE>,
the function has <I>n</I> parameters, but some are not used.
<P>
<H4>Restrictions:</H4>
<P>
Indexed and non-indexed insertion points
must not be mixed in a single pattern. 
<P>
<H2><A NAME="SEC4" HREF="ptg_toc.html#SEC4">Typed Insertion Points</A></H2>
<A NAME="IDX20"></A>
<A NAME="IDX21"></A>
<A NAME="IDX22"></A>
<A NAME="IDX23"></A>
<A NAME="IDX24"></A>
<A NAME="IDX25"></A>
<A NAME="IDX26"></A>
<A NAME="IDX27"></A>
<A NAME="IDX28"></A>
<P>
Data items can be inserted into the output text by specifying
insertion points to have one of the types
<CODE>int</CODE>, <CODE>string</CODE>, <CODE>long</CODE>, <CODE>short</CODE>, <CODE>char</CODE>,
<CODE>float</CODE> or <CODE>double</CODE>, e.g.
<A NAME="IDX29"></A>
<A NAME="IDX30"></A>
<P>
<PRE>
   Matrix:  "float " $1 "[" $2 int "][" $3 int "];\n"
</PRE>
The generated pattern function has the following signature:
<P>
<PRE>
   PTGNode PTGMatrix (PTGNode a, int b, int c)
</PRE>
Function calls must supply arguments of corresponding types.
They are output in a standard output representation.
<A NAME="IDX31"></A>
<P>
Another typical application of typed insertion point is
generating identifiers:
<P>
<PRE>
   Ident: $ string $ int
</PRE>
This pattern may be used to compose identifiers from a string and a
number, e.g. a call <CODE>PTGIdent ("abc", 5)</CODE> producing <CODE>abc5</CODE>.
The string item is often taken from the input of the language processor,
and the number is used to guarantee uniqueness of identifiers in the
output.
(This construct also substitutes the outdated leaf patterns, See  <A HREF="ptg_8.html#SEC21">Outdated Constructs</A>.)
<P>
A typical example for composition of output text
fragments from data of basic types is given by a pattern
that produces German car identifications:
<P>
<PRE>
   CarId: $ string $ string $int
</PRE>
which is applied for example by <CODE>PTGCarId ("PB-", "AB-", 127)</CODE>.
<P>
<H4>Restrictions:</H4>
<P>
If an indexed insertion point occurs multiply in a pattern
its type must be the same for all occurrences.
<P>
<H2><A NAME="SEC5" HREF="ptg_toc.html#SEC5">Function Call Insertion</A></H2>
<A NAME="IDX32"></A>
<A NAME="IDX33"></A>
<A NAME="IDX34"></A>
<P>
There are situations where it is inconvenient or impossible to
specify an output component by a pattern. In such cases calls
of user defined functions can be specified instead of
insertion points in a pattern.
<P>
Assume as an example that indentation shall be specified for the
output of a block structured language:
<P>
<PRE>
   Block:   [NewLine] "{" [Indent] $1   /* declarations */
                                   $2   /* statements */
                          [Exdent]
            [NewLine] "}"
</PRE>
This pattern for producing a block has two ordinary insertion points,
one for the declarations of the block and one for its statements. The
pattern function is called as usual with two corresponding arguments.
When the output text is produced the user defined functions
<CODE>NewLine</CODE>, <CODE>Indent</CODE>, and <CODE>Exdent</CODE> are called
in order to insert text at the specified pattern positions.
<A NAME="IDX35"></A>
<P>
In this case the functions must have exactly one parameter
that is a <CODE>PTG_OUTPUT_FILE</CODE>:
<P>
<PRE>
   extern void NewLine (PTG_OUTPUT_FILE f);
   extern void Indent (PTG_OUTPUT_FILE f);
   extern void Exdent (PTG_OUTPUT_FILE f);
</PRE>
The type <CODE>PTG_OUTPUT_FILE</CODE> can be supplied by the user. 
If it is not, a default is supplied by the generated file 
<CODE>ptg_gen.h</CODE>. The function has to be implemented such 
that a call outputs the desired text to the file pointed to by <CODE>f</CODE> by
using some provided output macros, See  <A HREF="ptg_7.html#SEC19">Influencing PTG Output</A>.
<P>
Note: These function calls are executed when the output text is produced.
The functions are not yet called when the patterns are applied.
PTG guarantees that those calls occur in left-to-right order
of the produced output text. Hence, the above triple of functions
may use global variables to keep track of the indentation level.
<P>
Functions, that support indentation ready to use in a PTG specification 
can be found in the module library, 
See  <A HREF="output_3.html#SEC3">Indentation of Specification Module Library: Creating Output</A>.
<A NAME="IDX36"></A>
<P>
Such function calls may also take arguments which are passed
through from the call of the pattern function. They are specified
by occurrences of insertion points within the call specification:
<P>
<PRE>
   Block:   [NewLine] "{" [Indent $3 int] $1   /* declarations */
                                          $2   /* statements */
                          [Exdent $3 int]
            [NewLine] "}"
</PRE>
In this case the indentation depth is determined individually
for each application of the <CODE>Block</CODE> pattern which is called
for example by <CODE>PTGBlock (d, s, 3)</CODE>. The last argument is
passed through to the calls of <CODE>Indent</CODE> and <CODE>Exdent</CODE>
which now must have the signatures
<P>
<PRE>
   extern void Indent (PTG_OUTPUT_FILE f, int i);
   extern void Exdent (PTG_OUTPUT_FILE f, int i);
</PRE>
<P>
Note: The arguments supplied with a pattern application are
stored until the functions are called when the output is produced.
<P>
In general several arguments may be specified to be passed through
to a function call. They may be typed by one of the types
<CODE>int</CODE>, <CODE>string</CODE>, <CODE>long</CODE>, <CODE>short</CODE>, <CODE>char</CODE>, 
<CODE>float</CODE>, <CODE>double</CODE> or <CODE>pointer</CODE>.
In case of type <CODE>pointer</CODE> the supplied argument of the
pattern function call must have a pointer type that is defined
for the corresponding parameter of the user function.
If no type is specified an argument of type <CODE>PTGNode</CODE>
is passed through.
<A NAME="IDX37"></A>
<P>
Arguments specified of type <CODE>pointer</CODE> are typically used
if the translation of certain data structures by user specified
functions is to be inserted into pattern driven translations.
<P>
<H2><A NAME="SEC6" HREF="ptg_toc.html#SEC6">Optional Parts in Patterns</A></H2>
<A NAME="IDX38"></A>
<P>
Parts of a pattern can be marked as optional by surrounding them with
braces. Using this notation, the optional parts will only be printed in
the output, if all other insertions of the pattern (insertions not 
marked optional by being included in a brace) produce output.
This can be applied to simplify the construction of lists considerably. 
<P>
<PRE>
   CommaSeq:    $1 {", "} $2
</PRE>
<P>
A call of the pattern function <CODE>PTGCommaSeq(a,b)</CODE> produces the separator
only if neither <CODE>a</CODE> nor <CODE>b</CODE> is empty; otherwise <CODE>a</CODE> and <CODE>b</CODE> 
are just concatenated, leaving out the optional part. This facility is especially 
useful if such separated lists are composed by pattern function calls that occur in
loops or in separated contexts. See  <A HREF="ptg_5.html#SEC12">A Complete Example</A>, for a more sophisticated example.
<P>
Note: The result of a pattern call is the unique value <CODE>PTGNULL</CODE> if the empty
output string is produced. (There is no way to further inspect the intermediate
results of pattern applications.) Certain pattern constructs do not yield 
<CODE>PTGNULL</CODE> 
even if they may represent empty strings:
<UL>
<LI>
Typed insertions and function call insertions,
<LI>
empty strings and empty literals.
</UL>
are considered not to be empty.
<P>
Another example for optional parts in patterns is the following:
<PRE>
   Paren:       {"("} $ {")"}
</PRE>
The pattern function <CODE>PTGParen(a)</CODE> will produce parentheses around <CODE>a</CODE>
if <CODE>a</CODE> is not empty. Otherwise, <CODE>PTGParen(a)</CODE> will be empty.
<P>
<H4>Restrictions:</H4>
<P>
An optional pattern is printed, if all non-optional insertions in
the node are not <CODE>PTGNULL</CODE>. However, if there are no non-optional 
insertions, the braces are ignored and a warning is issued.
<P>
It is possible to include more than one pattern in braces. Multiple optional
parts can be included in one Rule. However, the braces marking an optional
pattern cannot be used recursively inside an optional pattern.
<P>
<HR size=1 noshade width=600 align=left>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="ptg_1.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="ptg_3.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="ptg_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
</TD>
</TR>
</TABLE>

</BODY></HTML>
